Skip to main content

Run Agent in Docker

· 4 min read
Hu Chen

1. Docker、镜像和容器

  • Dockerfile:描述如何构建运行环境。
  • 镜像 Image:根据 Dockerfile 构建出的只读模板。
  • 容器 Container:镜像运行后产生的实例。
  • 每次执行 docker run,通常都会基于镜像创建一个新容器。
Dockerfile
↓ docker build
Image
↓ docker run
Container

构建镜像:

docker build -t agents-docker .

其中:

  • -t agents-docker:给镜像命名。
  • .:使用当前目录作为构建上下文。

Dockerfile 或镜像内的依赖发生变化后,需要重新构建:

docker build -t agents-docker .

可以在Docker Desktop中从Image中创造container,或者通过docker run的方式。

2. 配置dockerfile和项目文件

Configure the environment:

  • linux system: Debian 12 Bookworm + python 3.12
  • uv
FROM python:3.12-slim-bookworm

COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/

WORKDIR /app

CMD ["bash"]

pyproject.toml:

[project]
name = "agents-docker"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = [
"openai-agents",
"gradio",
]

同步环境:

uv sync

运行程序:

uv run python main.py

项目中主要有:

agents-docker/
├── Dockerfile
├── pyproject.toml
├── uv.lock
├── main.py
├── .env
└── .venv/

3. Bind mount:让容器直接看到项目文件

开发时可以把 Windows 当前项目目录挂载到容器的 /app

docker run --rm -it `
--env-file .env `
--mount type=bind,source="${PWD}",target=/app `
agents-docker

映射关系:

Windows 项目目录

容器 /app

因此:

  • 在 VS Code 中修改 main.py,容器立即能看到。
  • 容器在 /app 创建文件,Windows 项目目录也会出现。
  • 修改代码通常不需要重新构建镜像。

--rm 的含义

docker run --rm ...

表示容器停止后自动删除该容器。

它不会删除:

  • Docker 镜像
  • Windows 项目目录
  • bind mount 中的文件

它会删除容器自身文件系统中的临时修改,例如:

/tmp 下的文件
临时 apt install 的软件
未挂载目录中的修改

4. VS Code Dev Containers

仅在终端中进入容器,不代表 VS Code 编辑器本身已经进入容器。

之前的状态是:

VS Code 编辑器:Windows
终端:Docker Linux

因此 Windows VS Code 无法直接使用 Linux 路径:

/app/.venv/bin/python

通过 Dev Containers 连接后:

VS Code
└── Dev Container
├── Python 扩展
├── uv
└── /app/.venv/bin/python

此时可选择解释器:

/app/.venv/bin/python

Dev Containers和Docker两种VS Code扩展区别:

  • Dev Containers:用于在容器中开发。
  • Docker 扩展:用于查看和管理镜像、容器、网络和日志,可选但有用。

Python扩展需要重新安装到 Dev Container 环境中。